/*--------------------------------------------------------------------
 * bgworker_internals.h
 *		POSTGRES 可插拔后台工作程序内部
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * IDENTIFICATION
 *		src/include/postmaster/bgworker_internals.h
 *--------------------------------------------------------------------
 */
#ifndef BGWORKER_INTERNALS_H
#define BGWORKER_INTERNALS_H

#include "datatype/timestamp.h"
#include "lib/ilist.h"
#include "postmaster/bgworker.h"

/* GUC 选项 */

/*
 * 并行工作者的最大可能值。
 */
#define MAX_PARALLEL_WORKER_LIMIT 1024

/*
 * 后台工作者列表，仅对 postmaster 私有。
 *
 * 在注册期间请求数据库连接的工作者将设置 rw_backend，并将出现在 BackendList 中。注意：不要依赖
 * rw_backend 对于 shmem 连接的工作者是非 NULL 的！
 */
typedef struct RegisteredBgWorker
{
	BackgroundWorker rw_worker; /* 其注册条目 */
	struct bkend *rw_backend;	/* 其 BackendList 条目，或 NULL */
	pid_t		rw_pid;			/* 如果未运行则为 0 */
	int			rw_child_slot;
	TimestampTz rw_crashed_at;	/* 如果不为 0，表示最后崩溃的时间 */
	int			rw_shmem_slot;
	bool		rw_terminate;
	slist_node	rw_lnode;		/* 列表链接 */
} RegisteredBgWorker;

extern PGDLLIMPORT slist_head BackgroundWorkerList;

extern Size BackgroundWorkerShmemSize(void);
extern void BackgroundWorkerShmemInit(void);
extern void BackgroundWorkerStateChange(bool allow_new_workers);
extern void ForgetBackgroundWorker(slist_mutable_iter *cur);
extern void ReportBackgroundWorkerPID(RegisteredBgWorker *);
extern void ReportBackgroundWorkerExit(slist_mutable_iter *cur);
extern void BackgroundWorkerStopNotifications(pid_t pid);
extern void ForgetUnstartedBackgroundWorkers(void);
extern void ResetBackgroundWorkerCrashTimes(void);

/* 启动后台工作者的函数，从 postmaster.c 调用 */
extern void StartBackgroundWorker(void) pg_attribute_noreturn();

#ifdef EXEC_BACKEND
extern BackgroundWorker *BackgroundWorkerEntry(int slotno);
#endif

#endif							/* BGWORKER_INTERNALS_H */
